import axios from 'axios';
import store from '@/store';
import { getToken } from '@/utils/auth';
// 创建axios实例
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 请求路径
  withCredentials: true, // 当跨域请求时发送cookie
  timeout: 30000 // 请求超时时间
});

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 请求发送前 处理
    if (store.getters.token) {
      // 请求携带token
      // ['AUTHENTICATION'] 自定义token参数
      config.headers['AUTHENTICATION'] = getToken();
    }
    if (config['responseType'] === 'blob') {
      config['timeout'] = 0;
    }
    return config;
  },
  error => {
    // 请求出错
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  /**
   * 如果要获取http头部信息或者状态信息
   * Please return  response => response
  */

  /**
   * 通过HTTP状态码来判断请求状态
   */
  response => {
    const res = response;
    // 如果请求响应码不为200，请求出错
    if (res.status !== 200) {
      window.vm.$message.error({
        message: res.data.message || 'request occur Error',
        duration: 5 * 1000
      });
      return Promise.reject(new Error(res.message || 'Error'));
    } else {
      if (res.headers['content-disposition']) {
        return res;
      }
      if (res.data.code !== 200) {
        if (res.data.code === 1001 || res.data.code === 1010) {
          window.vm.$message.error({
            message: res.data.message || 'request occur Error',
            duration: 3 * 1000
          });
          setTimeout(() => {
            store.dispatch('user/resetToken').then(() => {
              if (location.hash === '#/marketing') { // 特殊情况（慎用）
                location.href = location.origin + '#/home/login?redirect=%2Fmarketing';
              } else {
                location.reload();
              }
            });
          }, 1000);
        } else if (res.data.code === 1002) {
          window.vm.$message.error({
            message: 'operation failure',
            duration: 3 * 1000
          });
        } else {
          window.vm.$message.error({
            message: res.data.message || 'request occur Error',
            duration: 3 * 1000
          });
        }
      }
      return res.data;
    }
  },
  error => {
    window.vm.$message.error({
      message: error.message,
      duration: 5 * 1000
    });
    return Promise.reject(error);
  }
);

export default service;
